import { reqGetBaseInfo, reqGetProfile, reqLogin } from '@/api/user'
import { getToken, setToken, removeToken } from '@/utils/auth'

const state = {
  // 先从本地获取token, 没有则为空
  token: getToken() || '',
  userInfo: {} // 用户信息
}

const mutations = {
  // 1. 提交token
  setToken(state, newToken) {
    state.token = newToken
    // 把token存储到本地cookie
    setToken(newToken)
  },
  // 2. 提交用户信息
  setUserInfo(state, newUserInfo) {
    state.userInfo = newUserInfo
  },
  // 3. 删除token
  removeToken(state) {
    state.token = ''
    // 删除本地cookie中存储的token
    removeToken()
  },
  // 4. 删除用户信息
  removeUserInfo() {
    state.userInfo = {}
  }
}

const actions = {
  // 1. 登录
  // async login(context, formObj) {
  //   // 1.1 调用登录请求接口
  //   const res = await reqLogin(formObj)
  //   console.log(res)
  //   const newToken = res.data
  //   // 1.2 把token存储到仓库
  //   context.commit('setToken', newToken)
  // }

  async login(context, formObj) {
    // return new Promise((resolve, reject) => {
    //   // 1.1 调用登录请求接口
    //   reqLogin(formObj).then((res) => {
    //     const newToken = res.data
    //     // 1.2 把token存储到仓库
    //     context.commit('setToken', newToken)
    //     // 1.3 把成功结果返回外部
    //     resolve(res)
    //   }).catch((err) => {
    //     // 1.4 把失败结果返回外部
    //     reject(err)
    //   })
    // })

    const res = await reqLogin(formObj)
    const newToken = res.data
    context.commit('setToken', newToken)
    return res
  },

  // 2. 获取用户信息
  async getUserInfo(context) {
    // return new Promise((resolve, reject) => {
    //   // 2.1 调用获取用户信息接口
    //   reqGetProfile().then((res) => {
    //     context.commit('setUserInfo', res.data)
    //     resolve(res)
    //   }).then((err) => {
    //     reject(err)
    //   })
    // })

    const { data: data1 } = await reqGetProfile()
    const { data: data2 } = await reqGetBaseInfo(data1.userId)
    const userObj = { ...data1, ...data2 }
    context.commit('setUserInfo', userObj)
    return userObj
  },

  // 3. 退出登录
  // action中不仅仅可以是异步操作, 也可以是同步操作
  logout(context) {
    context.commit('removeToken')
    context.commit('removeUserInfo')
  }
}

export default {
  // 保持独立的命名空间
  namespaced: true,
  state,
  mutations,
  actions
}
